package com.youshang520i;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author youshang
 */
@Aspect
@Component
public class MyAspect {

    /**
     * 为当前路径(com.youshang520i.service.MyService+)下所有的之类都实现了UsageTracked接口
     *
     */
    //"+"表示 MyServiceImpl 的所有子类；defaultImpl 表示默认需要添加的实现类
//    @DeclareParents(value= "com.youshang520i.service.MyService+", defaultImpl= UsageTrackedImpl.class)
//    public static UsageTracked mixin;

    /**
     * 第一个 * 代表的是方法的返回值
     * 第二个 * 代表的是当前类下所有的方法 (..) 代表所有方法的参数
     */
    @Pointcut(value = "execution(* com.youshang520i.service.impl.*.*(..))")
    public void pointcut(){
        System.out.println(23123);
    }

    @Before(value = "pointcut()")//&& this(usageTracked)
    public void recordUsage() {//UsageTracked usageTracked
        System.out.println("before ->>>>>>>>>>>>>>>>   before");
        //usageTracked.incrementUseCount();
//        mixin.incrementUseCount();
    }

    @Around(value = "pointcut()")
    public Object around(ProceedingJoinPoint joinPoint){
        Object proceed = null;

        try {
            proceed = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return proceed;
    }

}
